let isLock = true;
let clearLock;
let clearDelay1;
let clearDelay2;
let clearDelay3;
let clearDelay4;
let clearDelay5;
let clearDelay6;

const utils = {
	/**
	 * @method 函数持续锁
	 * @desc 规定时间内只触发一次函数执行，连续触发将会持续锁定，如：10秒内一直触发，锁定2秒，那么只会执行第一次（只有当用户间歇了2秒之后，才会继续执行）
	 * @param {Function} func 执行函数
	 * @param {Number} wait 锁定毫秒数
	 */
	lockContinue(func, wait = 1000) {
		if (isLock) {
			isLock = false;
			func();
		}
		clearTimeout(clearLock)
		clearLock = setTimeout(()=>{
			isLock = true;
		}, wait)
	},
	/**
	 * @method 函数间隙锁
	 * @desc 规定时间内只触发一次函数执行，连续触发将会间歇锁定，如：10秒内一直触发，锁定2秒，那么会间歇执行5次
	 * @param {Function} func 执行函数
	 * @param {Number} wait 锁定毫秒数
	 */
	lockInterval(func, wait = 1000) {
		if (isLock) {
			isLock = false;
			setTimeout(()=>{
				isLock = true;
			}, wait)
			func();
		}
	},
	/**
	 * @method 函数延迟执行锁
	 * @desc 函数延迟执行，延迟期间若触发，将取消上一次执行
	 * @param {Function} func 执行函数
	 * @param {Number} wait 延迟毫秒数
	 */
	lockDelay(func, wait = 1000, delayKey = 1) {
		switch (delayKey){
			case 2:
				clearTimeout(clearDelay2)
				clearDelay2 = setTimeout(()=>{
					func();
				}, wait)
				break;
			case 3:
				clearTimeout(clearDelay3)
				clearDelay3 = setTimeout(()=>{
					func();
				}, wait)
				break;
			default:
				clearTimeout(clearDelay1)
				clearDelay1 = setTimeout(()=>{
					func();
				}, wait)
				break;
		}
	},
	/**
	 * 删除空属性
	 * @param {Object} object 对象
	 */
	deleteEmptyProperty(object) {
		for (var i in object) {
			var value = object[i];
			if (typeof value === 'object') {
				if (Array.isArray(value)) {
					if (value.length == 0) {
						delete object[i];
						continue;
					}
				}
				this.deleteEmptyProperty(value);
				if (this.isEmpty(value)) {
					delete object[i];
				}
			} else {
				if (value === '' || value === null || value === undefined) {
					delete object[i];
				} else {}
			}
		}
		
		return object;
	},
	/**
	 * 是否空对象
	 * @param {Object} object 对象
	 */
	isEmpty(object) {
		for (var name in object) {
			return false;
		}
		return true;
	},
}

export default {
	lockContinue: utils.lockContinue,
	lockInterval: utils.lockInterval,
	lockDelay: utils.lockDelay,
	deleteEmptyProperty: utils.deleteEmptyProperty,
	isEmpty: utils.isEmpty,
}
